function [data_modified, outlier_table] = dataBox(data, columns_name)
    %% 返回每一列异常值的索引，利用元胞数组保存数据，以及用均值替代后的数据
    % Input:data | double类型
    %       columns_name:列名 | cell
    % Output:
    %        data_modified:均值替换后的数据 | table类型
    %        outlier_table:包含变量名、异常值、异常值索引的新表 | table
    
    %% 

    % 计算每列数据的均值
    mean_values = round(mean(data)); % 四舍五入取整

    % 计算每列数据的四分位数和四分位距
    Q1 = quantile(data, 0.25);
    Q3 = quantile(data, 0.75);
    IQR = Q3 - Q1;
    lower_threshold = Q1 - 1.5 * IQR;
    upper_threshold = Q3 + 1.5 * IQR;

    % 初始化变量
    [num_rows, num_cols] = size(data);
    outlier_indices = cell(1, num_cols);
    outliers = false(num_rows, num_cols);

    data_modified = data;
    outlier_table = table();

    % 检测并替换异常值
    for i = 1:num_cols
        outliers(:, i) = data(:, i) < lower_threshold(i) | data(:, i) > upper_threshold(i);
        outlier_indices{i} = find(outliers(:, i));
        data_modified(outliers(:, i), i) = mean_values(i);

        % 创建包含变量名、异常值、异常值索引的新表
        if ~isempty(outlier_indices{i})
            temp_table = table(repmat(columns_name(i), length(outlier_indices{i}), 1), ...
                               data(outlier_indices{i}, i), ...
                               outlier_indices{i}, ...
                               repmat(mean_values(i),length(outlier_indices{i}),1),...
                               'VariableNames', {'Variable', 'OutlierValue', 'Index','NewValue'});
            outlier_table = [outlier_table; temp_table];
        end
    end

    % 将 data_modified 转换为 table 类型，并添加列名
    data_modified = array2table(data_modified, 'VariableNames', columns_name);
end